package com.opcode.costa.ui.dashboard.leftmenu;

import java.io.ByteArrayInputStream;
import java.io.File;
import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.FrameLayout;
import android.widget.ListView;
import com.opcode.costa.R;
import com.opcode.costa.ui.dashboard.DashBoardFragment;
import com.opcode.nebulamobil.base.activities.MediaActivityBase;
import com.opcode.nebulamobil.base.components.ImageViewBase;
import com.opcode.nebulamobil.base.components.TextViewBase;
import com.opcode.nebulamobil.base.fragments.FragmentBase;
import com.opcode.nebulamobil.base.fragments.dialogfragments.SettingsDialogFragment;
import com.opcode.nebulamobil.enums.VoiceRecordingSaveType;
import com.opcode.nebulamobil.information.ApplicationInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus;
import com.opcode.nebulamobil.information.dataforms.costadataforms.ConnectionStatus.ConnectionStatusInfo;
import com.opcode.nebulamobil.information.dataforms.costadataforms.PersonalDataForm;
import com.opcode.nebulamobil.information.responses.costaresponses.PersonalListResp;
import com.opcode.nebulamobil.utility.FileProcess;
import com.opcode.nebulamobil.utility.JsonConverter;


/**
 * Bu sınıf, Sipariş takip sisteminde soldan gelecek menüyü hazırlamaktadır. Bu
 * menu içerisinde bas - konuş servisi yer alacaktır. Yalnızca dashboard ekranı
 * görnürken soldan menü gelebilir.
 * 
 * @author Okan ERDOĞAN
 * 
 * 4 Eyl 2014
 */
public class LeftMenuActivity extends MediaActivityBase {

	// Soldaki menünün layoutlarına ait
	private DrawerLayout nav_drawer_layout;
	private FrameLayout nav_drawer_content_frame;
	private ListView nav_drawer_left_drawer;

	// ActionBar'a ait başlıkları yönetmek amacıyla kullanılacaktır.
	private CharSequence mDrawerTitle;
	private CharSequence mTitle;

	// Soldan açılan menünün geçişlerini bu eleman yönetecektir.
	private ActionBarDrawerToggle mDrawerToggle;

	/*
	 * Bu değişken sistemde tanimli bütün personel listesini tutmaktadır.
	 * Böylece seçili personele mesaj gönderilebilir.
	 */
	private ArrayList<PersonalDataForm> personalDataFormList;

	/*
	 * Sunucudan gelen personel listesi bilgisi bu referansın işaret ettiği
	 * nesnede tutulacaktÝr.
	 */
	private PersonalListResp personalListResp;

	private MotionEvent event;

	private boolean recordingStart = false;

	private Handler myHandler = null;
	private Runnable myRunnable = null;

	private ConnectionStatus status;
	
	private PersonalDataForm personalDataForm;

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		// Burada login ekranında sunucudan alınıp sharedpreferences'a yazılan
		// personel listesi elde ediliyor.
		this.createSharedPreferencesManager("sharedpreferences", this);
		String personalDataFormListAsJson = (this.readFromSharedPreferences("personalDataFormList", null));
		this.personalListResp = (PersonalListResp) JsonConverter.fromJsonString(personalDataFormListAsJson, PersonalListResp.class);
		this.personalDataFormList = personalListResp.getPersonalList();
		
		//this.createSharedPreferencesManager("sharedpreferences", this);
		String personalDataFormAsJson = this.readFromSharedPreferences("personalDataForm", null);
		this.personalDataForm=(PersonalDataForm) JsonConverter.fromJsonString(personalDataFormAsJson,PersonalDataForm.class);

		// Manifest dosyasında bildirilen action bar tam ekran olmadğı için,
		// yazılımsal olarak uygulamanın bu ekranını tam ekran yapıyoruz.
		getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

		// Activity'ye ait xml dosyası ekleniyor.
		this.setContentView(R.layout.left_menu_activity_layout);

		this.nav_drawer_layout = (DrawerLayout) this.findViewById(R.id.nav_drawer_layout);

		// Burada drawer layout açıldığı zaman oluşacak gölgeyi ayarlıyoruz.
		this.nav_drawer_layout.setDrawerShadow(R.drawable.drawer_shadow,GravityCompat.START);

		this.nav_drawer_content_frame = (FrameLayout) this.findViewById(R.id.nav_drawer_content_frame);

		// Soldan açılan ekranda yer alan listview nesnesidir.
		this.nav_drawer_left_drawer = (ListView) this.findViewById(R.id.nav_drawer_left_drawer);
		this.nav_drawer_left_drawer.setAdapter(new PersonalListAdapter(this,R.layout.personal_list_left_menu_item_layout,personalDataFormList));

		this.nav_drawer_left_drawer.setOnItemLongClickListener(new OnItemLongClickListener() {

			@Override
			public boolean onItemLongClick(AdapterView<?> parent,View view, int position, long id) {

				playSoundFromAsset("recording_starts.wav");
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}

				startRecording(VoiceRecordingSaveType.RECORD_TO_COSTA_SERVER,personalDataFormList.get(position).getPersonelID(),personalDataForm.getPersonelID());
				recordingStart = true;
				System.out.println("Basıldı.");
				
				new Thread(){
                	public void run(){
                		try {
							Thread.sleep(5000);
							if(recordingStart){
								stopRecording(VoiceRecordingSaveType.RECORD_TO_COSTA_SERVER);
	    						playSoundFromAsset("recording_finishes.wav");
	    						recordingStart = false;
							}
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
                	}
                }.start();

				return false;
			}
		});

		this.nav_drawer_left_drawer.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {

				if (event.getAction() == MotionEvent.ACTION_UP) {
					if (recordingStart) {
						System.out.println("çekildi.");
						stopRecording(VoiceRecordingSaveType.RECORD_TO_COSTA_SERVER);
						try {
							Thread.sleep(500);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
						playSoundFromAsset("recording_finishes.wav");
						recordingStart = false;
					}

				}

				return false;
			}
		});

		// ActionBar'ın uygulamaya ait ikonunu gösterdiği alan aktif ediliyor.
		// Sol st köşede menü ikonu görüntülemek ve bu ikona basıldığında
		// menü açabilmek için bu ayarları yapıyoruz.
		this.getActionBar().setDisplayHomeAsUpEnabled(true);
		this.getActionBar().setHomeButtonEnabled(true);
		Drawable actionBarBackground = getResources().getDrawable(R.drawable.bckgrnd);
		this.getActionBar().setBackgroundDrawable(actionBarBackground);

		this.mTitle = mDrawerTitle = getTitle();

		// ActionBarDrawerToggle nesnesi oluşturuluyor.
		// Bu nesne navigationdrawer geçişini yönetiyor.
		this.mDrawerToggle = new ActionBarDrawerToggle(this, nav_drawer_layout,R.drawable.ic_drawer, R.string.drawer_open,R.string.drawer_close) {

			/**
			 * Drawer kapandığı zaman açılan metoddur.
			 */
			public void onDrawerClosed(View view) {
				getActionBar().setTitle(mTitle);
				invalidateOptionsMenu(); 	// Bu metod çağrıldığı zaman  onPrepareOptionsMenu metodu üst sınıf tarafından çağrılır.
			}

			/**
			 * Drawer açıldığı zaman çalışan metoddur.
			 */
			public void onDrawerOpened(View drawerView) {
				getActionBar().setTitle(mDrawerTitle);
				invalidateOptionsMenu(); 	// Bu metod çağrıldığı zaman onPrepareOptionsMenu metodu üst sınıf tarafından çağrılır.

			}
		};

		// Drawer toggle nesnesini olutßurduktan sonra bunu drawer layouta
		// listener olarak veriyoruz.
		this.nav_drawer_layout.setDrawerListener(mDrawerToggle);

		if (savedInstanceState == null) {

			FragmentBase dashBoardFragment = new DashBoardFragment();
			subFragmentAddToContainer(R.id.nav_drawer_content_frame,dashBoardFragment);
		}

		this.myHandler = new Handler();

		this.myRunnable = new Runnable() {
			public void run() {
				if (status.getConnectionStatusInfo() == ConnectionStatusInfo.CONNECTED) {
					nav_drawer_left_drawer.setBackgroundResource(R.drawable.bckgrnd);
				} else {
					nav_drawer_left_drawer.setBackgroundResource(R.drawable.item_background_red);
				}
			}
		};
		
		if(ApplicationInfo.getNebulaStatusListener()!=null){
			ApplicationInfo.getNebulaStatusListener().nebulaReadyStatus(true);
		}
	}

	public void onStart(){
		super.onStart();
		
	}
	
	public void onResume() {
		super.onResume();

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.menu, menu);
		return super.onCreateOptionsMenu(menu);
	}

	/**
	 * invalidateOptionsMenu() metodu çağrıldığı zaman üst sınıf tarafından bu
	 * metod tetiklenir.
	 */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		// Eğer navigation drawer açıkksa içerikle ilişkili elemanları gizler.
		boolean drawerOpen = this.nav_drawer_layout.isDrawerOpen(this.nav_drawer_left_drawer);

		menu.findItem(R.id.settings).setVisible(!drawerOpen);
		return super.onPrepareOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// NavigationDrawer'ın açılıp kapanmasını yönetir. Menu butonuna
		// basıldığı zaman bu metod tetiklenir.
		if (mDrawerToggle.onOptionsItemSelected(item)) {
			return true;
		}

		// Burada action bar'da yer alan butonlar ynetilir.
		switch (item.getItemId()) {

		/*
		 * Eğer arama butonuna (Byte ikonu) basılmışsa bu case çalışır.
		 */
		case R.id.settings:
			showGeneralDialog(new SettingsDialogFragment(), "ACTION_BAR_SETTING_DIALOG");
			return true;
			/*
			 * Varsayılan olarak ise bu case çalışır.
			 */
		default:
			return super.onOptionsItemSelected(item);
		}
	}

	public void onPause() {
		super.onPause();
	}

	/**
	 * 
	 * @author Okan ERDOĞAN
	 * 
	 * 4 Eyl 2014
	 */
	class PersonalListAdapter extends ArrayAdapter<PersonalDataForm> {

		private Context context;
		private int resourceId;
		private ArrayList<PersonalDataForm> arrayList;

		public PersonalListAdapter(Context context, int textViewResourceId,
				ArrayList<PersonalDataForm> objects) {
			super(context, textViewResourceId, objects);

			this.context = context;
			this.resourceId = textViewResourceId;

			this.arrayList = objects;
		}

		@SuppressLint("NewApi")
		public View getView(int position, View convertView, ViewGroup parent) {

			convertView = LayoutInflater.from(this.context).inflate(this.resourceId, null);

			PersonalDataForm personalDataForm = (PersonalDataForm) arrayList.get(position);
			TextViewBase personalName = (TextViewBase) convertView.findViewById(R.id.personal_name);
			TextViewBase personalSurname = (TextViewBase) convertView.findViewById(R.id.personal_surname);

			ImageViewBase personalImage = (ImageViewBase) convertView.findViewById(R.id.personal_image);

			personalName.setText(personalDataForm.getPersonalName());
			personalSurname.setText(personalDataForm.getPersonelSurName());

			if (convert(personalDataForm.getPersonelImage()) != null) {
				personalImage.setBackground(convert(personalDataForm.getPersonelImage()));
			} else {
				FileProcess fileProcess = new FileProcess();
				File file = new File(Environment.getExternalStorageDirectory()+ "//STS//personalImage//"+ String.valueOf(personalDataForm.getPersonelID())+ ".png");

				if (file.exists()) {
					Bitmap bitmap = fileProcess.readImageFromFile(file);
					BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
					personalImage.setBackground(bitmapDrawable);
				}

			}
			return convertView;
		}

		public int getCount() {
			return arrayList.size();
		}

		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
			this.arrayList = personalDataFormList;
		}

		/**
		 * Verilecek olan bir byte dizisinden yine verilecek olan görsel formata
		 * göre işlenip söz konusu görsel öğenin elde edilmesini sağlamak
		 * amacıyla kullanılacak olan uygulamadır.
		 */
		public Drawable convert(byte[] imageByte) {
			if (imageByte != null) {
				ByteArrayInputStream imageStream = new ByteArrayInputStream(imageByte);
				Bitmap personalLogo = BitmapFactory.decodeStream(imageStream);
				return new BitmapDrawable(getResources(), personalLogo);
			}
			return null;
		}
	}


	private void updateGUI() {
		myHandler.post(myRunnable);
	}


	@Override
	public void audioFileReady(String fileName) {
		System.out.println("Ses dosyasını "+fileName+" dosya yolunda bulabilirsiniz.");
	}

}
